home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
util
/
cdity
/
ModeProSrc.lha
/
Prefs
/
MPPSaver.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-08-06
|
7KB
|
239 lines
#include "/MPFiles.h"
#include <math.h>
/* Vars in ModePro.c */
extern struct MPSem *MPSem;
extern UWORD defaultpens[];
extern WORD NumDriPens;
extern struct FileRequester *FileReq;
extern struct Window *Win;
extern UBYTE filename[513];
extern struct TextAttr *TAttr;
LONG WCB(LONG Error, struct IFFHandle *iff,APTR a,LONG l);
LONG WriteString(LONG Error, struct IFFHandle *IFF,STRPTR Str);
#define FLAG(x,y) (x?y:0)
BOOL SaveFile(struct List *List, UBYTE *fname)
{
struct Promo pm;
struct IFFHandle *iff;
ULONG len,l;
LONG error;
UWORD font;
ULONG flags;
struct DefaultNode *n;
// APTR oldwin;
SetIoErr(0);
error=1;
if(iff=AllocIFF())
{
if(iff->iff_Stream = Open (fname,MODE_NEWFILE))
{
InitIFFasDOS(iff);
if( !(error=OpenIFF(iff,IFFF_WRITE)) )
{
if(!(error=PushChunk(iff,ID_PREF,ID_FORM, IFFSIZE_UNKNOWN)))
{
for(l=0;l<NUM_LISTS && error==0 ;l++)
{
n=(struct DefaultNode *)List[l].lh_Head;
while(n->Def_Node.ln_Succ && !error)
{
if(!(error=PushChunk(iff,ID_PREF,ID_PRMO, IFFSIZE_UNKNOWN)))
{
len=(strlen(n->Def_Node.ln_Name)+2)&0xfffffffe;
pm.Version =9; // <---- Muy importante
pm.Type =l;
pm.ModeSelect =n->ModeSelect;
pm.ModeID =n->ModeID;
pm.Width =n->Width;
pm.Height =n->Height;
pm.OverscanType =n->OverscanType;
pm.AutoScroll =n->AutoScroll;
pm.Look3D =n->Look3D;
pm.NameLen =len;
error=WCB(error,iff,&pm,sizeof(struct Promo));
error=WriteString(error,iff,n->Def_Node.ln_Name);
if(n->Look3D)
{
len=DRIPENS;
error=WCB(error,iff,&len,4);
error=WCB(error,iff,n->Pens,len*sizeof(n->Pens[0]));
}
else
{
len=0;
error=WCB(error,iff,&len,4);
}
/** Additions in Format 2 **/
flags=n->Flags;
error=WCB(error,iff,&flags,sizeof(flags));
font=n->FontType;
error=WCB(error,iff,&font,sizeof(font));
if(n->FontType==SFONT_MP)
{
error=WriteString(error,iff,n->Font.tta_Name);
error=WCB(error,iff,&n->Font.tta_YSize,4);
}
/*** Version 3 ***/
error=WCB(error,iff,&n->PubOptions,4);
error=WriteString(error,iff,FLAG(n->PubOptions,n->PubName));
/*** Version 4 ***/
error=WCB(error,iff,(APTR)&n->Depth,2);
error=WriteString(error,iff,FLAG(n->Flags & SHAREPENS,n->LockedPens));
/*** Version 5 ***/
error=WriteString(error,iff,FLAG(n->Flags & SCRHOTKEY,n->HotKey));
/*** Version 6 ***/
error=WCB(error,iff,&n->OrigDisplayID,sizeof(ULONG));
//printf("%8x\n",n->OrigDisplayID);
/*** Version 7 ***/
error=WCB(error,iff,&n->ODFlags,sizeof(UBYTE)*2);
if((n->Flags & DNF_PALETTE) && n->Colors && n->Palette)
{
error=WCB(error, iff,&n->Colors,sizeof(ULONG));
error=WCB(error, iff,n->Palette,sizeof(struct RGB)*n->Colors);
}
else
{
ULONG colors=0;
error=WCB(error, iff,&colors,sizeof(ULONG));
}
/*** Version 8 ***/
{
error=WCB(error, iff, &n->BackdropType,sizeof(UWORD)); // also writes BackdropFlags
error=WriteString(error,iff,(n->BackdropFlags?n->BackdropFile:0));
}
/*** Version 9 ***/
{
LONG bdsize;
switch(n->BackdropType)
{
case 2:
bdsize=(sizeof(n->BackdropRGB));
error=WCB(error, iff, &bdsize, sizeof(bdsize));
error=WCB(error, iff, &n->BackdropRGB,sizeof(struct RGB)); // also writes BackdropFlags
break;
default:
bdsize=0;
error=WCB(error, iff, &bdsize, sizeof(bdsize));
break;
}
}
/**** End of Data ***/
n=(struct DefaultNode *)(n->Def_Node.ln_Succ);
error|=PopChunk(iff);
}
}/* wend */
}/* end l */
if(!(error=PushChunk(iff,ID_PREF,ID_MPPR, IFFSIZE_UNKNOWN)))
{
struct MPPR_Chunk c;
c.Version =1;
c.EnablePromotion =MPSem->Enabled;
c.EnableNLM =MPSem->EnabledNLM;
c.AskUnknown =MPSem->CatchScreens;
c.AskUnknownPub =MPSem->CatchPubScreens;
c.CenterUnknown =MPSem->CenterAll;
error=WCB(error,iff,&c,sizeof(c));
error|=PopChunk(iff);
}
error|=PopChunk(iff);
}
CloseIFF(iff);
}
Close(iff->iff_Stream);
}
FreeIFF(iff);
}
if(error<0)
return(FALSE);
else
return(TRUE);
}
LONG WCB(LONG Error, struct IFFHandle *iff,APTR a,LONG l)
{
LONG error=0;
if(Error>=0)
{
error=WriteChunkBytes(iff,a,l);
if(error==l) error=0;
}
return(error);
}
LONG WriteString(LONG Error, struct IFFHandle *IFF,STRPTR Str)
{
LONG error=0,len;
WORD Null=0;
if(Error>=0)
{
if(Str)
{
len=strlen(Str)+1;
error=WCB(error,IFF,Str,len);
if(!error && (len & 1))
{
error=WCB(error,IFF,&Null,1); /* WORD align */
}
}
else
error=WCB(error,IFF,&Null,2);
}
return(error);
}
BOOL SelectFile(UBYTE *title,UBYTE save)
{
WORD width;
if(!FileReq)
{
width=Win->Width/2;
FileReq=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_TextAttr, TAttr,
ASLFR_InitialTopEdge, Win->TopEdge+8,
ASLFR_InitialLeftEdge, Win->LeftEdge+width/2,
ASLFR_InitialWidth, width,
ASLFR_InitialHeight, Win->Height-16,
ASLFR_DoPatterns , TRUE,
ASLFR_InitialPattern, "#?",
ASLFR_RejectIcons, TRUE,
TAG_DONE);
}
if(FileReq)
{
if(AslRequestTags(FileReq,
ASLFR_Window , Win,
ASLFR_SleepWindow , TRUE,
ASLFR_TitleText, title,
ASLFR_DoSaveMode, save,
TAG_DONE))
{
strncpy(filename,FileReq->fr_Drawer,512);
if(AddPart(filename,FileReq->fr_File,512))
return(TRUE);
}
}
return(FALSE);
}